const express=require('express')
const fs=require('fs')
const Router=express.Router()
const {getDb, saveDb} =require('./db.js')

Router.get('/',async  (req,res,next)=>{
    try {
        const db=await getDb()
        res.status(200).json(db.todos)
    } catch (error) {
        // return res.status(500).json({
        //     error:error.message
        // })
        next(error)
    }
})

Router.get('/:id',async (req,res,next)=>{
    try {
        const db=await getDb()
        const todo=db.todos.find(todo=>todo.id===Number.parseInt(req.params.id))
        if(!todo){
            return res.status(404).end()
        }
        res.status(200).json(todo)
    } catch (error) {
        // return res.status(500).json({
        //     error:error.message
        // })
        next(error)
    }
})
Router.post('/',async (req,res,next)=>{
    try {
        // 1. 获取客户端请求体参数
        const todo=req.body
        // 2. 数据验证
        if(!todo.name){
            return res.status(422).json({
                error:'The todo is empty'
            })
        }
        // 3. 数据验证通过，把数据存储到db对象中
        const db= await getDb()
        const lastTodo=db.todos[db.todos.length-1]
        todo.id=lastTodo?lastTodo.id+1:1
        db.todos.push(todo)
        await saveDb(db)

        // 4. 发送响应
        res.status(200).json(todo)
    } catch (error) {
        // return res.status(500).json({
        //     error:error.message
        // })
        
        next(error)
    }
    
})
/**
 * 修改任务
 */
Router.patch('/:id',async (req,res,next)=>{
    try {
        // 1. 获取表单数据
        const todo=req.body
        // 2.  查找到要修改的任务项
        const db=await getDb()
        const ret=db.todos.find(todo=>todo.id===Number.parseInt(req.params.id))

        if(!ret){
            return res.status(404).end()
        }
        Object.assign(ret,todo)
        await saveDb(db)
        res.status(200).json(ret)
    } catch (error) {
        // return res.status(500).json({
        //     error:error.message
        // })
        
        next(error)
    }
})
Router.delete('/:id',async (req,res,next)=>{
    try {
        const todoId=Number.parseInt(req.params.id)
        const db=await getDb()
        const index=db.todos.findIndex(todo=>todo.id===todoId)
        if(index===-1){
            return res.status(404).end()
        }
        db.todos.splice(index,1)
        await  saveDb(db)
        res.status(204).end()
    } catch (error) { 
        // return res.status(500).json({
        //     error:error.message
        // })
        
        next(error)
    }
})
module.exports=Router
